package com.warom.sdg.util;

import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;

import java.lang.reflect.Type;

/**
 * JSON工具类
 * 基于Gson库封装，提供JSON序列化和反序列化功能
 */
public class JsonUtil {
    private static final String TAG = "JsonUtil";
    
    // 默认Gson实例
    private static final Gson gson = new GsonBuilder()
            .setDateFormat("yyyy-MM-dd HH:mm:ss")
            .create();
    
    /**
     * 将对象转换为JSON字符串
     * @param object 需要转换的对象
     * @return JSON字符串
     */
    public static String toJson(Object object) {
        if (object == null) {
            return "{}";
        }
        
        try {
            return gson.toJson(object);
        } catch (Exception e) {
            Log.e(TAG, "转换对象到JSON失败: " + e.getMessage(), e);
            return "{}";
        }
    }
    
    /**
     * 将JSON字符串转换为指定类型的对象
     * @param json JSON字符串
     * @param classOfT 目标类型Class
     * @param <T> 返回类型
     * @return 转换后的对象
     */
    public static <T> T parseJson(String json, Class<T> classOfT) {
        if (json == null || json.isEmpty()) {
            return null;
        }
        
        try {
            return gson.fromJson(json, classOfT);
        } catch (JsonSyntaxException e) {
            Log.e(TAG, "解析JSON失败: " + e.getMessage() + ", JSON: " + json, e);
            return null;
        }
    }
    
    /**
     * 将JSON字符串转换为指定Type的对象
     * 适用于泛型类型，如List<Bean>
     * 
     * @param json JSON字符串
     * @param typeOfT 目标类型，例如: new TypeToken<List<Bean>>(){}.getType()
     * @param <T> 返回类型
     * @return 转换后的对象
     */
    public static <T> T parseJson(String json, Type typeOfT) {
        if (json == null || json.isEmpty()) {
            return null;
        }
        
        try {
            return gson.fromJson(json, typeOfT);
        } catch (JsonSyntaxException e) {
            Log.e(TAG, "解析JSON失败: " + e.getMessage() + ", JSON: " + json, e);
            return null;
        }
    }
    
    /**
     * 美化JSON字符串
     * @param json 原始JSON字符串
     * @return 格式化后的JSON字符串
     */
    public static String prettyJson(String json) {
        if (json == null || json.isEmpty()) {
            return "{}";
        }
        
        try {
            // 先将JSON字符串转换为对象，然后再格式化输出
            Object jsonObj = gson.fromJson(json, Object.class);
            return new GsonBuilder().setPrettyPrinting().create().toJson(jsonObj);
        } catch (Exception e) {
            Log.e(TAG, "美化JSON失败: " + e.getMessage(), e);
            return json;
        }
    }
} 